package com.tyk.bookstore.front.member.manager;


import com.tyk.bookstore.front.common.other.code.behavior.model.enume.SceneType;
import com.tyk.bookstore.front.member.model.enume.CenterUpdateType;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
@RequiredArgsConstructor
public class MemberRedisManager {

    private final StringRedisTemplate redisTemplate;

    /**
     * 行为验证码校验通过凭证
     */
    private static final String CODE_BEHAVIOR_PREFIX = "member:code:behavior:";
    private static final int CODE_BEHAVIOR_EXPIRE_TIME = 10;
    private static final TimeUnit CODE_BEHAVIOR_EXPIRE_TIME_UNIT = TimeUnit.MINUTES;


    /**
     * 消息验证码
     */
    private static final String CODE_MSG_PREFIX = "member:code:msg:code:";
    private static final int CODE_MSG_EXPIRE_TIME = 10;
    private static final TimeUnit CODE_MSG_EXPIRE_TIME_UNIT = TimeUnit.MINUTES;


    /**
     * 消息验证码校验通过凭证
     */
    private static final String CODE_MSG_CERTIFICATE_PREFIX = "member:code:msg:certificate:";
    private static final int CODE_MSG_CERTIFICATE_EXPIRE_TIME = 10;
    private static final TimeUnit CODE_MSG_CERTIFICATE_EXPIRE_TIME_UNIT = TimeUnit.MINUTES;

    /**
     * 消息验证码校验通过凭证
     */
    private static final String CODE_MSG_PASS_CERTIFICATE_PREFIX = "member:code:msg:certificate:";
    private static final int CODE_MSG_PASS_CERTIFICATE_EXPIRE_TIME = 10;
    private static final TimeUnit CODE_PASS_MSG_CERTIFICATE_EXPIRE_TIME_UNIT = TimeUnit.MINUTES;


    /**
     * 缓存消息验证码
     *
     * @param type        场景
     * @param certificate 消息验证码凭证
     * @param principal   主体（手机号/邮箱）
     * @param code        消息验证码
     */
    public void cacheMsgCode(SceneType type, String certificate, String principal, String code) {
        redisTemplate.opsForValue().set(
                getMsgCodeKey(type, certificate, principal),
                code,
                CODE_MSG_EXPIRE_TIME,
                CODE_MSG_EXPIRE_TIME_UNIT
        );
    }

    /**
     * 获取消息验证码
     *
     * @param scene       场景
     * @param certificate 消息验证码凭证
     * @param principal   主体（手机号/邮箱）
     * @return code       消息验证码
     */
    public String getMsgCode(SceneType scene, String certificate, String principal) {
        return redisTemplate.opsForValue().get(
                getMsgCodeKey(scene, certificate, principal)
        );
    }

    /**
     * 删除消息验证码
     *
     * @param scene       场景
     * @param certificate 消息验证码凭证
     * @param principal   主体（手机号/邮箱）
     */
    public void deleteMsgCode(SceneType scene, String certificate, String principal) {
        redisTemplate.delete(getMsgCodeKey(scene, certificate, principal));
    }

    /**
     * 获取消息验证码的Key
     *
     * @param scene       场景
     * @param certificate 消息验证码凭证
     * @param principal   主体（手机号/邮箱）
     * @return 消息验证码
     */
    private String getMsgCodeKey(SceneType scene, String certificate, String principal) {
        return CODE_MSG_PREFIX + scene.name() + ":" + certificate + ":" + principal;
    }


    /**
     * 缓存消息验证码通过凭证
     *
     * @param scene       场景
     * @param certificate 消息验证码通过凭证
     * @param principal   主体（手机号/邮箱）
     */
    public void cacheMsgPassCertificate(SceneType scene, String certificate, String principal) {
        redisTemplate.opsForValue().set(
                getMsgPassCertificateKey(scene, certificate, principal),
                principal,
                CODE_MSG_PASS_CERTIFICATE_EXPIRE_TIME,
                CODE_PASS_MSG_CERTIFICATE_EXPIRE_TIME_UNIT
        );
    }

    /**
     * 缓存消息验证码通过凭证
     *
     * @param scene       场景
     * @param certificate 消息验证码通过凭证
     * @param principal   主体（手机号/邮箱）
     * @return 主体
     */
    public String getMsgPassCertificate(SceneType scene, String certificate, String principal) {
        return redisTemplate.opsForValue().get(
                getMsgPassCertificateKey(scene, certificate, principal)
        );
    }

    /**
     * 获取消息验证码通过凭证的key
     *
     * @param scene       场景
     * @param certificate 消息验证码通过凭证
     * @param principal   主体（手机号/邮箱）
     */
    public String getMsgPassCertificateKey(SceneType scene, String certificate, String principal) {
        return CODE_MSG_PASS_CERTIFICATE_PREFIX + scene.name() + ":" + certificate + ":" + principal;
    }


    /**
     * 缓存消息验证码
     *
     * @param scene       场景
     * @param certificate 消息验证码凭证
     * @param principal   主体（手机号/邮箱）
     * @param type        更新类型
     * @param code        消息验证码
     */
    public void cacheMsgCode(SceneType scene, String certificate, String principal, CenterUpdateType type, String code) {
        redisTemplate.opsForValue().set(
                getMsgCodeKey(scene, certificate, principal, type),
                code,
                CODE_MSG_EXPIRE_TIME,
                CODE_MSG_EXPIRE_TIME_UNIT
        );
    }

    /**
     * 缓存消息验证码通过凭证
     *
     * @param scene       场景
     * @param certificate 消息验证码通过凭证
     * @param principal   主体（手机号/邮箱）
     * @param type        更新类型
     * @return 主体
     */
    public String getMsgCode(SceneType scene, String certificate, String principal, CenterUpdateType type) {
        return redisTemplate.opsForValue().get(
                getMsgCodeKey(scene, certificate, principal, type)
        );
    }

    /**
     * 获取消息验证码通过凭证的key
     *
     * @param scene       场景
     * @param certificate 消息验证码通过凭证
     * @param principal   主体（手机号/邮箱）
     * @param type        更新类型
     * @return 消息验证码通过凭证的key
     */
    public String getMsgCodeKey(SceneType scene, String certificate, String principal, CenterUpdateType type) {
        return CODE_MSG_PASS_CERTIFICATE_PREFIX + scene.name() + ":" + certificate + ":" + principal + ":" + type.name();
    }


    /**
     * 缓存消息验证码通过凭证
     *
     * @param scene       场景
     * @param certificate 消息验证码通过凭证
     * @param principal   主体（手机号/邮箱）
     * @param type        更改类型
     */
    public void cacheMsgPassCertificate(SceneType scene, String certificate, String principal, CenterUpdateType type) {
        redisTemplate.opsForValue().set(
                getMsgPassCertificateKey(scene, certificate, principal, type),
                principal,
                CODE_MSG_PASS_CERTIFICATE_EXPIRE_TIME,
                CODE_PASS_MSG_CERTIFICATE_EXPIRE_TIME_UNIT
        );
    }

    /**
     * 缓存消息验证码通过凭证
     *
     * @param scene       场景
     * @param certificate 消息验证码通过凭证
     * @param principal   主体（手机号/邮箱）
     * @param type        更改类型
     * @return 主体
     */
    public String getMsgPassCertificate(SceneType scene, String certificate, String principal, CenterUpdateType type) {
        return redisTemplate.opsForValue().get(
                getMsgPassCertificateKey(scene, certificate, principal, type)
        );
    }

    /**
     * 获取消息验证码通过凭证的key
     *
     * @param scene       场景
     * @param certificate 消息验证码通过凭证
     * @param principal   主体（手机号/邮箱）
     * @param type        更改类型
     * @return 消息验证码通过凭证的key
     */
    public String getMsgPassCertificateKey(SceneType scene, String certificate, String principal, CenterUpdateType type) {
        return CODE_MSG_PASS_CERTIFICATE_PREFIX + scene.name() + ":" + certificate + ":" + principal;
    }


}
